$(document).ready(function () {
    "use strict";
    var partidaDTO = {}, turnoAnterior = -1,
        nomeUsuario = $("#nomeUsuario")
            .text(),
        partidasDTO = [];

    function loadPartidaDTO(funcaoDelegada) {

        setTimeout(function () {
            loadPartidaDTOSemDelay(funcaoDelegada);
        }, 1500);
    }

    function loadPartidaDTOSemDelay(funcaoDelegada) {
        $.ajax({
            type: "GET",
            url: paginaUrl,
            timeout: 1500,
            dataType: 'json'
        }).done(function (json) {
            partidaDTO = jQuery.extend({}, json);
            funcaoDelegada();
        }).fail(function () {
            alert("O tempo dessa partida expirou.");
        });
    }

    function iniciarPartida() {
        loadPartidaDTOSemDelay(atualizarPartida);
    }

    function valorCelulaView(valorCelula, linhaAtual) {

        if (valorCelula !== "*") {

            if (valorCelula === "0") {
                return "\t";
            } else if (valorCelula === "1") {
                return ligacaoPonto(linhaAtual);
            } else {
                return donoCaixa(valorCelula);
            }

        } else {
            return valorCelula;
        }

    }

    function ligacaoPonto(indiceLinha) {
        if (isHorizontal(indiceLinha)) {
            return "——";
        } else {
            return "|";
        }
    }

    function donoCaixa(valorCelula) {
        var tamanho = valorCelula.length;
        if (tamanho > 3) {
            var idDonoCaixa = valorCelula.substring(1, tamanho - 1);
            if (idDonoCaixa === partidaDTO.jogador1) {
                return "P. 1";
            } else {
                return "P. 2";
            }
        } else {
            return "\t";
        }

    }

    function isHorizontal(indiceLinha) {
        return indiceLinha % 2 === 0;
    }

    function atualizarInterface() {
        var linhaAtual = [],
            htmlSaida = "",
            valorCelula = "";

        htmlSaida += "<caption>Vez de: " + partidaDTO.jogadorAtual + " | " + partidaDTO.jogador1 + " " + partidaDTO.pontosJogador1 + " vs " + partidaDTO.jogador2 + " " + partidaDTO.pontosJogador2 + "</caption>";

        for (var linha = 0, qtdLinhas = partidaDTO.matriz.length; linha < qtdLinhas; linha++) {
            linhaAtual = partidaDTO.matriz[linha];
            if(isHorizontal(linha)){
                htmlSaida += "<tr class='horizontal'>";
            } else {
                htmlSaida += "<tr class='vertical'>";
            }

            for (var celula = 0, qtdCelulas = linhaAtual.length; celula < qtdCelulas; celula++) {
                valorCelula = linhaAtual[celula];
                htmlSaida  += "<td class='";
                
                if(celula % 2 == 0) {
                    htmlSaida += " vertical ";
                } else {
                    htmlSaida += " horizontal ";
                }
                
                if(linha % 2 == 1 && celula % 2 == 1){
                    htmlSaida += " box ";
                } else  if(linha % 2 == 0 && celula % 2 == 0) {
                    htmlSaida += " ponto ";
                }
                
                if(valorCelula === "1"){
                    htmlSaida += " traco ";
                } else if(valorCelula === "["+partidaDTO.jogador1+"]") {
                    htmlSaida += " jogador1 ";
                } else if(valorCelula === "["+partidaDTO.jogador2+"]") {
                    htmlSaida += " jogador2 ";
                }
                
                htmlSaida += "'></td>";
            }

            htmlSaida += "</tr>";
        }

        $("#jogo").html(htmlSaida);

        if (isJogoFinalizado()) {
            finalizarPartida();
        }
    }

    function isJogoFinalizado() {
        return partidaDTO.jogoFinalizado;
    }

    function finalizarPartida() {
    	try{
        	Android.alerta(partidaDTO.jogador1 + ": " + partidaDTO.pontosJogador1 + "\n" + partidaDTO.jogador2 + ": " + partidaDTO.pontosJogador2, "/panel/partidasmobile");
    	}
    	catch(err) {}
        alert(partidaDTO.jogador1 + ": " + partidaDTO.pontosJogador1 + "\n" + partidaDTO.jogador2 + ": " + partidaDTO.pontosJogador2);
        window.location.href = "/panel/index";
    }

    function atualizarPartida() {
        if (isTurnoDiferente() || isPrimeiroTurno()) {
            atualizarInterface();
            passarTurno();
        }
        if (isTurnoAdversario() || esperandoAdversario()) {
            if (!isJogoFinalizado()) {
                loadPartidaDTO(atualizarPartida);
            }
        }
    }

    function isPrimeiroTurno() {
        return turnoAnterior === 0;
    }

    function esperandoAdversario() {
        return partidaDTO.jogador2 === "";
    }

    function isTurnoAdversario() {
        return partidaDTO.jogadorAtual !== nomeUsuario;
    }

    function isMeuTurno() {
        return partidaDTO.jogadorAtual === nomeUsuario;
    }

    function isTurnoDiferente() {
        return turnoAnterior !== partidaDTO.turno;
    }

    function passarTurno() {
        turnoAnterior = partidaDTO.turno;
    }

    $("#jogo tr td").live("click", function () {
        var $this = $(this),
            linha = $this.closest("tr").prevAll("tr").length,
            celula = $this
                .prevAll("td").length;

        if (isMeuTurno() && $.trim($this.text()) === "") {
            $.ajax({
                type: "POST",
                url: paginaUrl,
                data: {
                    "id": partidaDTO.idPartida,
                    "altura": linha,
                    "largura": celula
                },
                dataType: 'json'
            }).done(function (json) {
                partidaDTO = jQuery.extend({}, json);
                atualizarPartida();
            }).fail(function () {
            alert("O tempo dessa partida expirou.");
        });
        }
    });

    var paginaUrl = window.location.toString();

    if (paginaUrl.indexOf("panel/partida/") !== -1) {
        iniciarPartida();
    }

    if (paginaUrl.indexOf("panel/index") !== -1 || paginaUrl.indexOf("panel/partidasmobile") !== -1) {
        iniciarListaPartidas();
    }

    function iniciarListaPartidas() {
        loadListaPartidasSemDelay(atualizarListaPartidas);
    }

    function atualizarListaPartidas() {
        var htmlSaidaEspera = "",
            htmlSaidaAtivas = "";

        for (var index = 0, tamanho = partidasDTO.length; index < tamanho; index++) {
            if (partidasDTO[index].jogador2 === "") {
                htmlSaidaEspera += "<li>" + adicionarLinkPartida(partidasDTO[index]) + "</li>";
            } else {
                htmlSaidaAtivas += "<li>" + adicionarLinkPartida(partidasDTO[index]) + "</li>";
            }
        }

        $("#lista-espera").html(htmlSaidaEspera);
        $("#lista-ativas").html(htmlSaidaAtivas);
        loadListaPartidas(atualizarListaPartidas);
    }

    function adicionarLinkPartida(partida) {
        var htmlSaida = "<a data-ajax='false' href=\"/panel/partida/" + partida.idPartida + "\">";
        htmlSaida += (((partida.matriz.length + 1) / 2)-1) + "x" + (((partida.matriz[0].length + 1) / 2)-1) + " | " + partida.jogador1;
        htmlSaida += (partida.jogador2 !== "") ? " vs " + partida.jogador2 : "";
        htmlSaida += "</a>";
        return htmlSaida;
    }

    function loadListaPartidas(funcaoDelegada) {
        setTimeout(function () {
            loadListaPartidasSemDelay(funcaoDelegada);
        }, 1500);
    }

    function loadListaPartidasSemDelay(funcaoDelegada) {
        $.ajax({
            type: "GET",
            url: "/panel/partida",
            timeout: 1500,
            dataType: 'json'
        }).done(function (json) {
            partidasDTO = jQuery.extend([], json);
            funcaoDelegada();
        });
    }
});